﻿#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/4/29 10:20
# @Author  : CHEN Wang
# @Site    :
# @File    : wechat_tool.py
# @Software: PyCharm

"""
通过wxpusher发送Weixin的消息
http://wxpusher.zjiecode.com/
开通步骤：
1、关注公众号，注册
2、通过公众号，获取UID
3、通过网站打开管理后台：http://wxpusher.zjiecode.com/admin/ 使用微信扫码登录，=》应用列表=》新建应用，如vnpy2，并获得APP_TOOKEN
4、应用列表=》应用（vnpy2）=》 关注.
"""

"""
脚本说明:
由于微信对于自身软件的定位问题，官方不支持微信机器人，并且也没有开放官方机器人的计划。
然而对于想利用私域流量来做项目的人群来说，使用脚本来监视微信消息，并能够自动发送消息一直都是刚需所在。
https://github.com/cluic/wxauto
https://github.com/cluic/wxautoapi

WeChatPYAPI：
https://www.jianshu.com/p/a30d13497196
https://github.com/mrsanshui/WeChatPYAPI
"""

from threading import Lock, Thread
import requests
import sys
import traceback
from datetime import datetime
from functools import wraps
# from vnpy.trader.utility import print_dict
global wechat_lock
wechat_lock = Lock()

# 这里可以设置UIDS, 多个人可同时接收
UIDS = ['UID_8RIyLlPq7c5H']
APP_TOKEN = 'AT_zueTbAm3qrDJy2BvWtGZIhF'
# AT_zueTbAm3qrDJy2BvWtYwJwqVgRjGZIhF

class wechat_thread(Thread):
    """
    采用线程方式，不阻塞
    """

    def __init__(self, uids: list, content: str, topic_ids: list = [], url: str = '', app_token=''):

        # text：消息标题，最长为256，必填。
        # desp：消息内容，最长64Kb，可空，支持MarkDown。

        super(wechat_thread, self).__init__(name="wechat_thread")
        self.request_url = "http://wxpusher.zjiecode.com/api/send/message"
        self.uids = uids
        self.content = content
        self.topic_ids = topic_ids
        self.url = url
        self.lock = wechat_lock
        self.app_token = app_token if len(app_token) > 0 else APP_TOKEN

    def run(self):
        if self.content is None or len(self.content) == 0:
            return
        params = {}
        params['appToken'] = self.app_token
        params['content'] = self.content
        params['contentType'] = 1
        params['topicIds'] = self.topic_ids
        params['uids'] = self.uids
        params['url'] = self.url

        # 发送请求
        try:
            response = requests.post(self.request_url, json=params).json()
            if not response.get('success', False):
                print(response)
        except Exception as e:
            print("{} wechat_thread sent failed! ex:{},trace:{}".format(datetime.now(), str(e), traceback.format_exc()),
                  file=sys.stderr)
            return

        print("wechat_thread sent successful!")


def send_wx_msg(*args, **kwargs):
    """
    发送微信Msg
    :param content:   发送内容
    :return:
    """
    content = kwargs.get('content', None)
    if content is None:
        if len(args) == 0:
            return
        content = args[0]
    if len(content) == 0:
        return


    if not isinstance(content, str):
        if isinstance(content, dict):
            content = '{}'.format(print_dict(content))
        else:
            content = str(content)

    uids = kwargs.get('uids', [])
    # 没有配置的话，使用缺省UID
    if len(uids) == 0:
        uids.extend(UIDS)

    app_token = kwargs.get('app_token')

    t = wechat_thread(uids=UIDS, content=content, app_token=APP_TOKEN)
    t.daemon = False
    t.start()


def wxauto_test(who='文件传输助手', msg='你好'):
    from wxauto import *
    # 获取当前微信客户端
    wx = WeChat()

    # # 获取会话列表
    # wx.GetSessionList()
    # # 输出当前聊天窗口聊天消息
    # msgs = wx.GetAllMessage
    # for msg in msgs:
    #     print('%s : %s' % (msg[0], msg[1]))
    # ## 获取更多聊天记录
    # wx.LoadMoreMessage()
    # msgs = wx.GetAllMessage
    # for msg in msgs:
    #     print('%s : %s' % (msg[0], msg[1]))

    # # 向某人发送消息（以`文件传输助手`为例）
    # msg = '你好~'
    # who = '文件传输助手'
    # wx.ChatWith(who)  # 打开`文件传输助手`聊天窗口
    # wx.SendMsg(msg)  # 向`文件传输助手`发送消息：你好~
    wx.ChatWith(who)  # 打开`文件传输助手`聊天窗口
    wx.SendMsg(msg)  # 向`文件传输助手`发送消息：你好~

    ## 发送换行消息（最近很多人问换行消息如何发送，新增说明一下）
    msg = '''
    你好
    这是第二行
    这是第三行
    这是第四行'''
    who = '文件传输助手'
    WxUtils.SetClipboard(msg)  # 将内容复制到剪贴板，类似于Ctrl + C
    wx.ChatWith(who)  # 打开`文件传输助手`聊天窗口
    wx.SendClipboard()  # 发送剪贴板的内容，类似于Ctrl + V

    # # 向某人发送文件（以`文件传输助手`为例，发送三个不同类型文件）
    # file1 = 'D:/test/wxauto.py'
    # file2 = 'D:/test/pic.png'
    # file3 = 'D:/test/files.rar'
    # who = '文件传输助手'
    # wx.ChatWith(who)  # 打开`文件传输助手`聊天窗口
    # wx.SendFiles(file1, file2, file3)  # 向`文件传输助手`发送上述三个文件
    # # 注：为保证发送文件稳定性，首次发送文件可能花费时间较长，后续调用会缩短发送时间
    #
    # # 向某人发送程序截图（以`文件传输助手`为例，发送微信截图）
    # name = '微信'
    # classname = 'WeChatMainWndForPC'
    # wx.ChatWith(who)  # 打开`文件传输助手`聊天窗口
    # wx.SendScreenshot(name, classname)  # 发送微信窗口的截图给文件传输助手


if __name__ == "__main__":
    # wxpid = 14776
    # # wxid = "filehelper"
    # wxid = "信息推送测试"
    # msg = "爱你，老婆"
    # main(wxpid, wxid, msg)
    wxauto_test(who='文件传输助手', msg='爱你，老婆')

    text = u'www.uquant.org 学量化投资，到优量在线'
    send_wx_msg(text)
